import%20marimo%0A%0A__generated_with%20%3D%20%220.17.6%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22%2C%20auto_download%3D%5B%22html%22%2C%20%22ipynb%22%5D)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20pytz%0A%20%20%20%20import%20datetime%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20india_timezone%20%3D%20pytz.timezone(%22Asia%2FKolkata%22)%0A%20%20%20%20now%20%3D%20datetime.datetime.now(india_timezone)%0A%0A%20%20%20%20curr%20%3D%20now.strftime(%22%25Y-%25m-%25d%2C%20%25I%3A%25M%3A%25S%20%25p%20%25Z%22)%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20rf%22%22%22%0A%20%20%20%20%23%20Week%20-%208%0A%0A%20%20%20%20**Submission%20Date%3A**%20%602025-11-16%2C%2023%3A59%20IST%60%0A%0A%20%20%20%20**Last%20Updated%3A**%20%60%7Bcurr%7D%60%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%0A%20%20%20%20from%20sklearn.model_selection%20import%20train_test_split%0A%20%20%20%20from%20sklearn.feature_extraction.text%20import%20CountVectorizer%2C%20TfidfVectorizer%0A%0A%20%20%20%20from%20sklearn.compose%20import%20ColumnTransformer%0A%20%20%20%20from%20sklearn.pipeline%20import%20Pipeline%0A%20%20%20%20from%20sklearn.preprocessing%20import%20StandardScaler%2C%20OrdinalEncoder%2C%20OneHotEncoder%0A%20%20%20%20from%20sklearn.naive_bayes%20import%20MultinomialNB%0A%20%20%20%20from%20sklearn.metrics%20import%20log_loss%2C%20confusion_matrix%0A%20%20%20%20from%20sklearn.ensemble%20import%20RandomForestClassifier%0A%20%20%20%20from%20sklearn.feature_selection%20import%20RFECV%0A%20%20%20%20from%20sklearn.linear_model%20import%20LogisticRegression%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20ColumnTransformer%2C%0A%20%20%20%20%20%20%20%20CountVectorizer%2C%0A%20%20%20%20%20%20%20%20LogisticRegression%2C%0A%20%20%20%20%20%20%20%20MultinomialNB%2C%0A%20%20%20%20%20%20%20%20OneHotEncoder%2C%0A%20%20%20%20%20%20%20%20OrdinalEncoder%2C%0A%20%20%20%20%20%20%20%20RFECV%2C%0A%20%20%20%20%20%20%20%20RandomForestClassifier%2C%0A%20%20%20%20%20%20%20%20StandardScaler%2C%0A%20%20%20%20%20%20%20%20TfidfVectorizer%2C%0A%20%20%20%20%20%20%20%20confusion_matrix%2C%0A%20%20%20%20%20%20%20%20log_loss%2C%0A%20%20%20%20%20%20%20%20pd%2C%0A%20%20%20%20%20%20%20%20train_test_split%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20DATASET%20%3D%20%22https%3A%2F%2Fdrive.google.com%2Fuc%3Fid%3D1BljShfWAQ9-0O6PAurjC-XIX4_EuLMpw%26export%3Ddownload%22%0A%20%20%20%20return%20(DATASET%2C)%0A%0A%0A%40app.cell%0Adef%20_(DATASET%2C%20pd)%3A%0A%20%20%20%20df%20%3D%20pd.read_csv(DATASET)%0A%20%20%20%20return%20(df%2C)%0A%0A%0A%40app.cell%0Adef%20_(df)%3A%0A%20%20%20%20df.sample()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(df)%3A%0A%20%20%20%20X%20%3D%20df.drop(%22sentiment%22%2C%20axis%3D1)%0A%20%20%20%20y%20%3D%20df%5B%22sentiment%22%5D%0A%20%20%20%20return%20X%2C%20y%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Question%201%0A%20%20%20%20Exploring%20the%20dataset%0A%20%20%20%20*%20Load%20the%20dataset%20into%20colab%20enviornment.%0A%20%20%20%20*%20Split%20the%20dataset%20into%20train%20set%20and%20test%20set%20with%2020%25%20dataset%20belonging%20to%20test%20set.%20Keep%20the%20random_state%3D0.%0A%20%20%20%20*%20Determine%20the%20number%20of%20unique%20words%20in%20the%20text%20column%20of%20train%20set.%20Consider%20all%20words%2C%20including%20stop%20words%2C%20and%20ignore%20case%20differences.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(X%2C%20train_test_split%2C%20y)%3A%0A%20%20%20%20X_train%2C%20X_test%2C%20y_train%2C%20y_test%20%3D%20train_test_split(%0A%20%20%20%20%20%20%20%20X%2C%20y%2C%20test_size%3D0.2%2C%20random_state%3D0%0A%20%20%20%20)%0A%20%20%20%20return%20X_test%2C%20X_train%2C%20y_test%2C%20y_train%0A%0A%0A%40app.cell%0Adef%20_(CountVectorizer%2C%20X_train)%3A%0A%20%20%20%20vectorizer%20%3D%20CountVectorizer()%0A%20%20%20%20vectorizer.fit_transform(X_train%5B%22text%22%5D)%0A%20%20%20%20return%20(vectorizer%2C)%0A%0A%0A%40app.cell%0Adef%20_(vectorizer)%3A%0A%20%20%20%20len(vectorizer.get_feature_names_out())%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Question%202%0A%0A%20%20%20%20%23%23%23%20Preprocessing%0A%0A%20%20%20%20Apply%20preprocessing%20to%20the%20features%20of%20both%20the%20training%20and%20test%20datasets%20as%20follows%3A%0A%20%20%20%20-%20For%20numerical%20Feature%20(Land%20Area%20(Km%C2%B2))%0A%20%20%20%20%20%20*%20scale%20using%20StandardScaler.%0A%0A%20%20%20%20-%20For%20ordinal%20feautres%20(Density_Level%2C%20Population_Group)%0A%20%20%20%20%20%20*%20Apply%20OrdinalEncoder%20with%20the%20following%20category%20mapping%3A%20%22Low%22%20%E2%86%92%200%2C%20%22Medium%22%20%E2%86%92%201%2C%20%22High%22%20%E2%86%92%202.%0A%0A%20%20%20%20-%20For%20nominal%20features%20(Age%20of%20User%2C%20Time%20of%20Tweet%2C%20Continent)%0A%20%20%20%20%20%20*%20Use%20OneHotEncoder%20with%20sparse_ouput%3DFalse%20and%20drop%3Dfirst%0A%0A%20%20%20%20-%20For%20text%20features%20(text)%0A%20%20%20%20%20%20*%20Apply%20TfidfVectorizer%20with%20the%20following%20parameters%3A%0A%20%20%20%20%20%20%20%20*%20lowercase%3DTrue%0A%20%20%20%20%20%20%20%20*%20stop_words%3Denglish%0A%20%20%20%20%20%20%20%20*%20max_features%3D5000%0A%20%20%20%20%20%20%20%20*%20ngram_range%3D(1%2C%202)%0A%20%20%20%20%20%20%20%20*%20token_pattern%3Dr(%3Fu)%5Cb%5Cw%5Cw%2B%5Cb%7C%5B%40%23%5D%5Cw%2B%20(to%20include%20hashtags%20and%20mentions)%0A%20%20%20%20%20%20%20%20*%20strip_accents%3Dunicode%20(to%20normalize%20characters%20like%20%22%C3%A9%22)%0A%0A%20%20%20%20Calculate%20the%20sum%20of%20all%20the%20values%20present%20in%20first%20five%20rows%20of%20transformed%20test%20feature%20matrix%20%3F%20(upto%202%20digits%20after%20the%20decimal)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20ColumnTransformer%2C%0A%20%20%20%20OneHotEncoder%2C%0A%20%20%20%20OrdinalEncoder%2C%0A%20%20%20%20StandardScaler%2C%0A%20%20%20%20TfidfVectorizer%2C%0A)%3A%0A%20%20%20%20preprocessor%20%3D%20ColumnTransformer(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22num%22%2C%20StandardScaler()%2C%20%5B%22Land%20Area%20(Km%C2%B2)%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22ord%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20OrdinalEncoder(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20categories%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Low%22%2C%20%22Medium%22%2C%20%22High%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Low%22%2C%20%22Medium%22%2C%20%22High%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Density_Level%22%2C%20%22Population_Group%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22nom%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20OneHotEncoder(sparse_output%3DFalse%2C%20drop%3D%22first%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Age%20of%20User%22%2C%20%22Time%20of%20Tweet%22%2C%20%22Continent%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22text%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20TfidfVectorizer(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lowercase%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stop_words%3D%22english%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_features%3D5000%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ngram_range%3D(1%2C%202)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20token_pattern%3Dr%22(%3Fu)%5Cb%5Cw%5Cw%2B%5Cb%7C%5B%40%23%5D%5Cw%2B%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20strip_accents%3D%22unicode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22text%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20remainder%3D%22passthrough%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(preprocessor%2C)%0A%0A%0A%40app.cell%0Adef%20_(X_test%2C%20X_train%2C%20preprocessor)%3A%0A%20%20%20%20X_train_trans%20%3D%20preprocessor.fit_transform(X_train)%0A%20%20%20%20X_test_trans%20%3D%20preprocessor.transform(X_test)%0A%20%20%20%20return%20X_test_trans%2C%20X_train_trans%0A%0A%0A%40app.cell%0Adef%20_(X_test_trans)%3A%0A%20%20%20%20round(X_test_trans.toarray()%5B%3A5%5D.sum()%2C%202)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Question%203%0A%0A%20%20%20%20%23%23%23%20Model%20Building%0A%20%20%20%20Train%20a%20MultinomialNB%20model%20on%20the%20preprocessed%20training%20dataset%2C%20excluding%20the%20Land%20Area%20(Km%C2%B2)%20column%2C%20as%20MultinomialNB%20does%20not%20support%20negative%20input%20values.%20Then%2C%20evaluate%20the%20model%20by%20calculating%20the%20log_loss%20on%20the%20test%20dataset%2C%20also%20excluding%20the%20Land%20Area%20(Km%C2%B2)%20feature.%0A%20%20%20%20%3E%20**Note%3A**%20The%20Land%20Area%20(Km%C2%B2)%20feature%20is%20excluded%20only%20for%20this%20specific%20question.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(MultinomialNB%2C%20X_test_trans%2C%20X_train_trans%2C%20log_loss%2C%20y_test%2C%20y_train)%3A%0A%20%20%20%20mnb%20%3D%20MultinomialNB()%0A%20%20%20%20mnb.fit(X_train_trans%5B%3A%2C%201%3A%5D%2C%20y_train)%0A%20%20%20%20log_loss(y_test%2C%20mnb.predict_proba(X_test_trans%5B%3A%2C%201%3A%5D))%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Question%204%0A%0A%20%20%20%20%23%23%23%20Error%20Analysis%0A%0A%20%20%20%20Train%20a%20RandomForestClassifier%20with%20random_state%3D42%20on%20the%20preprocessed%20training%20dataset.%20This%20time%2C%20include%20all%20features%2C%20including%20Land%20Area%20(Km%C2%B2)%2C%20in%20both%20the%20training%20and%20test%20datasets.%0A%0A%20%20%20%20After%20training%2C%20evaluate%20the%20model%20on%20the%20preprocessed%20test%20dataset.%20Which%20class%20did%20the%20model%20find%20most%20confusing%20(as%20per%20preprocessed%20test%20dataset)%3F%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(RandomForestClassifier%2C%20X_train_trans%2C%20y_train)%3A%0A%20%20%20%20rfc%20%3D%20RandomForestClassifier(random_state%3D42)%0A%20%20%20%20rfc.fit(X_train_trans%2C%20y_train)%0A%20%20%20%20return%20(rfc%2C)%0A%0A%0A%40app.cell%0Adef%20_(X_test_trans%2C%20rfc%2C%20y_test)%3A%0A%20%20%20%20rfc.score(X_test_trans%2C%20y_test)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(rfc)%3A%0A%20%20%20%20rfc.classes_%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(X_test_trans%2C%20confusion_matrix%2C%20rfc%2C%20y_test)%3A%0A%20%20%20%20conf_matrix%20%3D%20confusion_matrix(y_test%2C%20rfc.predict(X_test_trans))%0A%20%20%20%20conf_matrix%0A%20%20%20%20return%20(conf_matrix%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20conf_matrix.sum(axis%3D1)%20%23%20%5B1348%2B184%2C%20267%2B1474%5D%0A%20%20%20%20%23%20conf_matrix.diagonal()%20%23%20%5B1348%2C%201474%5D%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(conf_matrix)%3A%0A%20%20%20%20misclassifications%20%3D%20conf_matrix.sum(axis%3D1)%20-%20conf_matrix.diagonal()%0A%20%20%20%20misclassifications%0A%20%20%20%20return%20(misclassifications%2C)%0A%0A%0A%40app.cell%0Adef%20_(misclassifications%2C%20rfc)%3A%0A%20%20%20%20rfc.classes_%5Bmisclassifications.argmax()%5D%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Question%205%0A%20%20%20%20%23%23%23%20Feature%20selection%0A%0A%20%20%20%20Use%20RFECV%20with%0A%0A%20%20%20%20-%20estimator%3DLogisticRegression(random_state%3D42%2C%20max_iter%3D1000)%0A%20%20%20%20-%20step%3D100%0A%20%20%20%20-%20n_jobs%20%3D%20-1%0A%0A%20%20%20%20How%20many%20features%20got%20selected%3F%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(LogisticRegression%2C%20RFECV%2C%20X_train_trans%2C%20y_train)%3A%0A%20%20%20%20refcv%20%3D%20RFECV(%0A%20%20%20%20%20%20%20%20estimator%3DLogisticRegression(random_state%3D42%2C%20max_iter%3D1000)%2C%0A%20%20%20%20%20%20%20%20step%3D100%2C%0A%20%20%20%20%20%20%20%20n_jobs%3D-1%2C%0A%20%20%20%20)%0A%0A%20%20%20%20refcv.fit(X_train_trans%2C%20y_train)%0A%20%20%20%20return%20(refcv%2C)%0A%0A%0A%40app.cell%0Adef%20_(refcv)%3A%0A%20%20%20%20refcv.n_features_%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
5022899e4267b137b1a3c4031d90522860057f58ac7c7133b79824443aa1f51b